在 .NET 專案中使用 Microsoft.Office.Interop.Excel 的常見問題
最近加班忙翻了,最近才比較有空補之前的筆記 orz,但有點懶,就不截圖了。
許多政府單位在系統開發時,都會要求 Excel 匯出功能必須同時支援 ODS 格式。在 .NET 生態系統中,處理 ODS 的套件大多是付費的,就算有免費版本也會有功能限制。因此,常見的解決方案是先產生 Excel 檔案,再透過 Microsoft.Office.Interop.Excel 來讀取主機上的 Office Excel,將檔案另存成 ODS 格式。
不過這個做法在本機開發時可能運作正常,但部署到 Server 環境後就會碰到一些問題。以下列出一些我遇到的問題。
dotnet publish 編譯異常
因為 COM 元件的特性,這種處理方式只能在 Windows 環境底下使用。 Visual Studio 的發佈功能跟 dotnet publish 指令都是以 MSBuild 為基礎,不過它們用的執行環境可能不一樣,所以會造成行為跟輸出結果有些差異。Visual Studio 是使用安裝在 Visual Studio 裡面的 MSBuild,而 dotnet publish 則是用 .NET SDK 裡面附的 MSBuild 版本。再加上兩邊在專案設定跟參數處理上可能有差異,這就會導致在 Visual Studio 可以正常編譯,但用 dotnet publish 的時候卻會跳出以下錯誤:
error MSB4803: MSBuild 的 .NET Core 版本不支援工作 "ResolveComReference"。請使用 MSBuild 的 .NET Framework 版本。這問題我沒找到解法,目前作法就是建立一個 .NET Framework 的 Web API。當系統需要轉換成 ODS 格式時,就呼叫這個專門的 API 服務來處理轉換工作並回傳結果。
執行時的錯誤處理流程
1. DCOM 元件權限不足
如果執行時遇到以下錯誤訊息:
System.UnauthorizedAccessException: Retrieving the COM class factory for component with CLSID {00024500-0000-0000-C000-000000000046} failed due to the following error: 80070005 存取被拒。 (0x80070005 (E_ACCESSDENIED)).這表示需要設定 DCOM 權限: 在 Windows Server 環境中,COM 元件的存取是由 DCOM (Distributed COM) 安全性機制管理的。為了讓 IIS 應用程式能夠控制 Excel,我們需要明確授予存取權限:
開啟 DCOM 設定工具:
- 按下 Windows + R。
- 輸入 dcomcnfg。
- 依序展開:元件服務 > 電腦 > 我的電腦 > DCOM 設定。
設定 Microsoft Excel Application:
- 在清單中尋找 "Microsoft Excel Application":
- 點擊右鍵選擇「內容」。
- 切換到安全性頁籤。
- 在存取權限區塊中,點選「自訂」。
- 將 IIS APPPOOL{應用程式集區名稱} 加入到使用者清單中。
- 設定存取權限:
- localhost 連線:勾選本機存取。
- 外部 IP 連線:勾選遠端存取。
2. Excel 檔案存取問題
當執行過程中,如果出現找不到 Excel 檔案的錯誤訊息,這是因為 Excel COM 元件在執行時會嘗試存取使用者的桌面路徑。在 Windows Server 環境中,系統服務帳戶預設沒有桌面資料夾,所以我們需要手動建立。
Desktop 資料夾的建立位置應該是看 Microsoft Office 版本:
- 32 位元 Office:
C:\Windows\SysWOW64\config\systemprofile\Desktop。 - 64 位元 Office:
C:\Windows\System32\config\systemprofile\Desktop。
注意事項
- 此設定僅適用於 Windows 環境。
- 需要在伺服器上安裝 Microsoft Office。
- 每次 Windows 更新後可能需要重新檢查權限設定。
異動歷程
- 2024-10-21 初版文件建立。
